Date		:	9 juin 1991
		Protection	:	DISQUETTE CLEF
		Programme	:       DICK TRACY
		Outils		:	SOFT-ICE, SOURCER, QUAID, MASM, EXE2BIN.
		Fichier		:	n�ant
		Temps pass�	:	12 Heures
		Soci�t�		:	TITUS
		Divers	        :	Cr�ation du fichier FRED.COM
		Origine		:	MICHOU
		Num�ro		:	086


	Une protection disquette 3.5" 720k en piste 4F ( 80 ).
	L'auteur de la protection a beaucoup d'humour puisque dans tout
	les secteurs de la piste 79 on peut lire des choses interessantes,
	voir ci-dessous. Et de toute �vidence la protection se trouve dans
	la piste 79 secteur 247 !!!

  Cylinder 79, Side 0, Sector 247:

  0000  A001prot by Eric CAEN (c) Titus 1990...Hackers, I hate you !!!!N
  0040  NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
  0080  NNNNNNNNNNNNNNNNNNNNNNNNN_                                 000? 
  00c0                                      (hh @ @  S                 
  0100                  (hh~TYX] \   [X \  H  XZY\ H \ H [[Y[  HH@      
  0140                                                                  

  Cylinder 79, Side 0, Sector 10:

  0000  Sector number J Hackers are women !!!                           
  0040                                                                  
  0080                                                                  
  00c0                                                                  
  0100                                                                  
  0140                                                                  

	Je commence � lan�er QUAID pour voir sur quelle interruption je peux
	me placer avec SOFT-ICE. Le message WRONG DISK est affich� � l'aide de
	l'INT 21 fonction 09. Je place donc SOFT-ICE sur cette interruption et
	d�s qu'il s'affiche je dessassemble en arri�re pour voir ce qui le fait
	passer par l�. Ceci n'est pas toujours possible. Et effectivement le
	programme va tester 3 fois la disquette par un CALL puis fait un test
	pour finalement afficher le message et se bloquer. En forcant le saut
	apr�s l'un des CALL le soft fonctionne. C'est presque trop beau.
	
	Et effectivement c'est trop beau car d'une part cette chaine est
	comme de bien entendu introuvable et d'autre part tout les fichiers
	except� le LOADER "loaddick.com" sont crypt�s.

	La routine qui teste la protection de la disquette est la suivante:

	E83100		CALL  00B1  -->   PREMIER TEST
	7325		JAE   00A7  -->   SI OK ON SAUTE APRES L'INT 21
	E82C00		CALL  00B1  -->   SECOND TEST	
	7320	        JAE   00A7  -->   SI OK SAUT APRES L'INT 21
	.		.
	.		INT 21  AH=09  --->  AFFICHAGE MESSAGE D'ERREUR   
	.		INT 21  AH=4C  --->  TERMINATE PROCESS

	Il suffit de transformer un des 73 en EB ( JMP ).
	En essayant de savoir d'ou vient mon 73 je remonte 3 niveaux en arri�re
	pour me retrouver dans le programme de LOADDICK.COM
	Ce fichier LOADDICK.COM est un d�compacteur qui charge soit EGA.SQZ ou
	bien CGA.SQZ. Il va de soit que la moindre modification dans EGA.SQZ
	fait tout planter. J'ai bien sur trouv� la chaine dans laquelle se
	trouve mon 73, celui-ci modifi� en EB plante le programme.
	
	Chaine dans EGA.SQZ: 73806E807D804F point� par DS:1DA.	
		
	La modification faite au moment ou le programme LOADDICK a fini de
	charger EGA.SQZ et passe la main � celui-ci ne fonctionne pas plus.
	Le seul moment ou cel� fonctionne c'est au retour de l'INT 40 avant
	que le soft ne teste le FLAG CARRY. Autant dire qu'il n'y a pratiquement
	plus de solution. Il en reste pourtant une ( et il y en a toujours une
	il suffit simplement de la trouver et de vouloir y consacrer suffisament
	de temps pour la mettre au point, c'est d'ailleurs sur ce dernier point
	que compte les auteurs de protections en tout genre puisque la volont�
	de craquer un logiciel est inversement proportionnelle au temps qu'on
	met pour trouver la parade.

	Donc je pense que le d�tournement de l'INT 40 ou l'INT 21 pour faire
	mon patch ne devrait pas poser trop de probl�me, de plus c'est un
	exercice de haute voltige car il va falloir jouer avec le pointeur de
	pile. ( c'est ce que je d�teste le plus...)

	Je d�cide de laisser de cot� l'INT 21 car cette derni�re est appel�e
	un nombre incalculables de fois par le programme pour jeter mon d�volu
	sur l'INT 40.

	Le sch�ma directeur en est le suivant:

	Faire un petit morceau de code qui redirige l'INT 40 sur une routine
	personnelle qui effectuera le patch puis executera l'INT 40 normalement.
	Ce petit morceau de code devra �tre lancer avant le jeu lui-m�me et
	rester r�sident. Autrement dit il faut �crire un petit programme TSR.
	
	Le listing ci-dessous est suffisement comment� sans n�cessiter 
	d'explications compl�mentaires.

	
code      segment
          org    100h
          assume cs:code
start:    jmp    installe
cr        equ    0dh
lf        equ    0ah
adr_ip    equ    0071h
patch     equ    0EBh	; jmp � mettre � la place de JAE ( 73 )
_off      equ 	 2ah 	; SP + 2a = 0FBA ---> adr de CS:0071

initprog  db     cr,lf
          db     '    Si Disque Dur OK sinon utiliser la disquette copi�e '
          db     'avec COPY BOARD',cr,lf,'$'
instok    db     cr,lf,'                   See you soon FREDDY_SOFT',cr,lf,'$'

int40     label  dword	;sauvegarde des adresses SEG:OFF de l'INT40
i40off    db     0,0	;d'origine.
i40seg    db     0,0
flag	  db     0,0	;Si le patch est fait on saute la routine.

tsrint40  proc   far	; point d'entr� de mon INT40 modifi�
          sti
          nop
          push   ds	; on sauve tout les registres.
          push   es
          push   di
          push   si
          push   dx
          push   cx
          push   bx
          push   ax
	  cmp byte ptr [flag],1h	  ; On regarde si c'est fait...
	  jz suite			  ; Si c'est d�j� fait on continu...
          mov ax,sp			  ; SP est envoy� dans AX.
increm:   pop ds	     ; On commence par la position actuelle de SP.
          cmp byte ptr ds:[adr_ip],73h	  ; Et on compare l'octet en
					  ; DS:[adr_ip] � 73. ( CS:IP )
	  jnz increm	     ; On teste la position SP+2 ( puisque l'on a POP� )
	  mov byte ptr ds:[adr_ip],patch  ; Si �gale � 73 on y met EB.
          mov byte ptr [flag],1h          ; On met le drapeau.
	  mov sp,ax     		  ; On remet le pointeur d'origine.
suite:	  pop    ax			  ; Et on restaure les registres...
          pop    bx
          pop    cx
          pop    dx
          pop    si
          pop    di
          pop    es
          pop    ds
          pushf
          cli
	  call   int40	; appel de l'INT40 officielle.
          ret    2      ; et on revient
tsrint40  endp
eor:

; ROUTINE D'INSTALLATION EN RESIDENT DU CODE CI-DESSUS.

installe: mov    ax,cs			; CS --> DS
          mov    ds,ax
          mov    dx,offset initprog     ; message de debut
          mov    ah,09h
          int    21h
          mov    ax,3540h               ; on detourne l'int 40h
          int    21h			; sous-fonction 35
          mov    word ptr [i40off],bx
          mov    i40seg,es
          mov    ax,2540h               ; et on met l'ad. du resident
          mov    dx,offset tsrint40	; sous-fonction 25
          int    21h
          mov    dx,offset instok       ; message de fin
          mov    ah,09h
          int    21h
          mov    dx,eor-start+100h+15	; A voir....
          mov    cl,4
          shr    dx,cl
          mov    al,0
          mov    ah,31h                 ; sortie et reservation
          int    21h                    ; de la memoire

code      ends
          end start

	Voil� et cel� fonctionne parfaitement ( test� sur un 386 et deux 286 )
	du moment que le jeu est install� sur disque dur, par contre sur
	disquette cel� se plante mais ce ne doit pas �tre grand chose.
	( revoir la recherche de l'octet, ou bien changer d'IT )

	FREDDY